package mylab.starters.dag.graph;

import com.google.common.collect.Sets;
import lombok.NonNull;
import mylab.base.foundation.lang.StringIdName;

import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;

public interface Vertex extends StringIdName {

    Graph getGraph();

    void setGraph(@NonNull Graph graph);


    /**
     * 节点的入度
     * <p>
     * 不同于常规的定义，这里的入度只计算强依赖的节点，当 indegree=0 时，当前任务才能执行
     * </>
     */
    AtomicInteger getIndegree();


    /**
     * 前置节点
     */
    Set<Vertex> getDependentVertices();

    /**
     * 后置节点
     */
    Set<Vertex> getAdjacentVertices();

    default Vertex dependOn(@NonNull Vertex... vertices) {
        //为本节点添加前置节点
        Sets.newHashSet(vertices).forEach(vertex -> getDependentVertices().add(vertex));
        for (Vertex vertex : vertices) {
            //前置节点邻接本节点
            vertex.getAdjacentVertices().add(this);
        }
        return this;
    }

    default Vertex adjacent(@NonNull Vertex... vertices) {
        //为本节点添加邻接节点
        Sets.newHashSet(vertices).forEach(vertex -> getAdjacentVertices().add(vertex));
        for (Vertex vertex : vertices) {
            //邻接节点依赖本节点
            vertex.getDependentVertices().add(this);
        }
        return this;
    }

}
